[微信小程序开发]云数据库排障:找不到函数?访问无权限?
date
Mar 29, 2022
slug
[微信小程序开发]云数据库排障:找不到函数?访问无权限?
status
Published
tags
JavaScript
微信小程序
summary
type
Post
场景
这两天写了一个小程序,用到了云开发的云函数和数据库。对于个人开发者,玩一下技术还是十分方便的,而且入门套餐是免费的:免服务器、免运维,值得试一试。
其间遇到两个小问题,却花费了挺多时间去处理,确实有点浪费,这里记录下来,供大家参考。
故障一:访问无权限
报错信息:-502003 database permission denied | errMsg: Permission denied.
- 看到这个错误,我马上去检查了一下数据库配置,新建表的默认权限是:仅创建者可读写,数据是我创建的,应该没问题啊?我抱着试试看的想法,把权限改为:所有用户可读,仅创建者可读写。还是不行。
- 遇事不决查文档,内置权限规则这样解释的:
- 当权限为 "仅创建者可读写" 时,查询时会默认给查询条件加上一条
_openid
必须等于用户openid
. - 当权限为 "仅创建者可读写" 或 "所有用户可读,仅创建者可写" 时,更新前会默认先带上
_openid
必须等于用户openid
的查询条件,再将查询到的结果进行更新,即使是用doc.update
也是如此(因此我们会见到即使我们没有对应_id
的记录的访问权限,但是更新操作不会失败,只会在返回的结果中说明updated
更新的记录数量为 0)。 - 创建记录时,会自动给记录加上
_openid
字段,值等于用户openid
,并且不允许用户在创建记录时尝试设置_openid
. - 更新记录时,不允许修改
_openid
.
以下摘录自微信开发文档:
- 根据上面的文档,理论上我改过权限配置之后是没问题的,保险起见我还是给数据记录增加了
_openid
字段,并填入我的openid
,然而还是不行:-I。
- 去谷歌碰碰运气,翻了好几页,发现有位同仁遇到同样的问题,并分享了解决方法:原来是因为
aggregate
查询不能在客户端使用,必须在云函数中使用。
- 总结一下:阅读 API 文档很重要!
故障二:找不到函数
报错信息:db.getCollection(...).aggregate is not a function.
排查过程:
强烈推荐大家在开发云函数过程使用本地调试,可以本地小程序触发或手工出发。
- 第一反应是:是不是拼写错误,来回检查了几遍,排除(这里要说一下:如果有 IDE 语法提示,就不存在这个问题,TypeScript 这么火是有道理的)。
- 不是拼写,那就单步跟踪一下好了,发现
db.getCollection(...)
这里有返回,但是对象上面没有挂aggregate
方法。
- 大致能判断出来了,是 sdk 版本问题,去检查一下
package.json
,版本是 lasted,也没问题。到这里,很多人可能就会疑惑了:怎么回事?往下看!
- 接下来就必须去验明正身了,打开
node_modules
文件夹,找到wx-server-sdk
文件夹,查看package.json
,发现版本不对,问题就在这里了!
- 但是为什么
package.json
中版本正常,安装就不对了呢?有经验的同学肯定会想到lock
文件,我想起来这个云函数是复制项目模版的,检查一下yarn.lock
,果然是这个问题,删掉重装一下,至此问题解决!